/*
 * Konami-JS ~ 
 * :: Now with support for touch events and multiple instances for 
 * :: those situations that call for multiple easter eggs!
 * Code: http://konami-js.googlecode.com/
 * Examples: http://www.snaptortoise.com/konami-js
 * Copyright (c) 2009 George Mandis (georgemandis.com, snaptortoise.com)
 * Version: 1.4.2 (9/2/2013)
 * Licensed under the MIT License (http://opensource.org/licenses/MIT)
 * Tested in: Safari 4+, Google Chrome 4+, Firefox 3+, IE7+, Mobile Safari 2.2.1 and Dolphin Browser
 */

var Konami = function (callback) {
        var konami = {
                addEvent: function (obj, type, fn, ref_obj) {
                        if (obj.addEventListener)
                                obj.addEventListener(type, fn, false);
                        else if (obj.attachEvent) {
                                // IE
                                obj["e" + type + fn] = fn;
                                obj[type + fn] = function () {
                                        obj["e" + type + fn](window.event, ref_obj);
                                }
                                obj.attachEvent("on" + type, obj[type + fn]);
                        }
                },
                input: "",
                pattern: "38384040373937396665",
                load: function (link) {
                        this.addEvent(document, "keydown", function (e, ref_obj) {
                                if (ref_obj) konami = ref_obj; // IE
                                konami.input += e ? e.keyCode : event.keyCode;
                                if (konami.input.length > konami.pattern.length)
                                        konami.input = konami.input.substr((konami.input.length - konami.pattern.length));
                                if (konami.input == konami.pattern) {
                                        konami.code(link);
                                        konami.input = "";
                                        e.preventDefault();
                                        return false;
                                }
                        }, this);
                        this.iphone.load(link);
                },
                code: function (link) {
                        window.location = link
                },
                iphone: {
                        start_x: 0,
                        start_y: 0,
                        stop_x: 0,
                        stop_y: 0,
                        tap: false,
                        capture: false,
                        orig_keys: "",
                        keys: ["UP", "UP", "DOWN", "DOWN", "LEFT", "RIGHT", "LEFT", "RIGHT", "TAP", "TAP"],
                        code: function (link) {
                                konami.code(link);
                        },
                        load: function (link) {
                                this.orig_keys = this.keys;
                                konami.addEvent(document, "touchmove", function (e) {
                                        if (e.touches.length == 1 && konami.iphone.capture == true) {
                                                var touch = e.touches[0];
                                                konami.iphone.stop_x = touch.pageX;
                                                konami.iphone.stop_y = touch.pageY;
                                                konami.iphone.tap = false;
                                                konami.iphone.capture = false;
                                                konami.iphone.check_direction();
                                        }
                                });
                                konami.addEvent(document, "touchend", function (evt) {
                                        if (konami.iphone.tap == true) konami.iphone.check_direction(link);
                                }, false);
                                konami.addEvent(document, "touchstart", function (evt) {
                                        konami.iphone.start_x = evt.changedTouches[0].pageX;
                                        konami.iphone.start_y = evt.changedTouches[0].pageY;
                                        konami.iphone.tap = true;
                                        konami.iphone.capture = true;
                                });
                        },
                        check_direction: function (link) {
                                x_magnitude = Math.abs(this.start_x - this.stop_x);
                                y_magnitude = Math.abs(this.start_y - this.stop_y);
                                x = ((this.start_x - this.stop_x) < 0) ? "RIGHT" : "LEFT";
                                y = ((this.start_y - this.stop_y) < 0) ? "DOWN" : "UP";
                                result = (x_magnitude > y_magnitude) ? x : y;
                                result = (this.tap == true) ? "TAP" : result;

                                if (result == this.keys[0]) this.keys = this.keys.slice(1, this.keys.length);
                                if (this.keys.length == 0) {
                                        this.keys = this.orig_keys;
                                        this.code(link);
                                }
                        }
                }
        }

        typeof callback === "string" && konami.load(callback);
        if (typeof callback === "function") {
                konami.code = callback;
                konami.load();
        }

        return konami;
};